package com.powernode.map.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.powernode.common.execption.PowerException;
import com.powernode.common.result.ResultCodeEnum;
import com.powernode.map.service.MapService;
import com.powernode.model.form.map.CalculateDrivingLineForm;
import com.powernode.model.vo.map.DrivingLineVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.util.HashMap;

/**
 * 地图服务实现类
 * 提供计算驾车路线的功能，利用腾讯地图API进行路线计算
 */
@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class MapServiceImpl implements MapService {
    @Resource
    private RestTemplate restTemplate; // REST模板，用于发送HTTP请求
    @Value("${tencent.map.key}")
    private String key; // 腾讯地图API密钥，从配置文件注入

    /**
     * 计算驾车路线
     * 调用腾讯地图API计算两点之间的驾车路线信息
     *
     * @param calculateDrivingLineForm 路线计算表单，包含起点和终点坐标
     * @return DrivingLineVo 驾车路线信息视图对象
     */
    @Override
    public DrivingLineVo calculateLine(CalculateDrivingLineForm calculateDrivingLineForm) {
        // 腾讯地图驾车路线API地址模板
        String url = "https://apis.map.qq.com/ws/direction/v1/driving/?from={from}&to={to}&key={key}";

        // 构建请求参数映射
        HashMap<String, String> hashMap = new HashMap<>();
        // 设置起点坐标（纬度,经度）
        hashMap.put("from", calculateDrivingLineForm.getStartPointLatitude() + "," + calculateDrivingLineForm.getStartPointLongitude());
        // 设置终点坐标（纬度,经度）
        hashMap.put("to", calculateDrivingLineForm.getEndPointLatitude() + "," + calculateDrivingLineForm.getEndPointLongitude());
        // 设置API密钥
        hashMap.put("key", key);

        // 发送GET请求到腾讯地图API，获取JSON格式的响应结果，参数：URL、响应类型、参数映射
        JSONObject result = restTemplate.getForObject(url, JSONObject.class, hashMap);

        // 检查API响应状态，0表示成功，非0表示失败
        if (result.getIntValue("status") != 0) {
            // 抛出地图服务异常
            throw new PowerException(ResultCodeEnum.MAP_FAIL);
        }

        // 从响应结果中提取路线信息，getJSONObject("result")获取结果对象，getJSONArray("routes")获取路线数组，getJSONObject(0)获取第一条路线
        JSONObject route = result.getJSONObject("result").getJSONArray("routes").getJSONObject(0);

        // 创建驾车路线视图对象
        DrivingLineVo drivingLineVo = new DrivingLineVo();
        // 获取距离（单位：米）
        BigDecimal meter = route.getBigDecimal("distance");
        // 将米转换为公里，保留2位小数，四舍五入
        BigDecimal distance = meter.divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_UP);
        // 设置距离
        drivingLineVo.setDistance(distance);
        // 设置行驶时间（单位：秒）
        drivingLineVo.setDuration(route.getBigDecimal("duration"));
        // 设置路线折线坐标
        drivingLineVo.setPolyline(route.getJSONArray("polyline"));

        // 返回完整的驾车路线信息
        return drivingLineVo;
    }
}
